package com.boot2.core.model.vo;

import com.boot2.core.dao.PageInfo;
import com.boot2.core.dict.ErrorCode;
import com.boot2.core.web.RequestContext;
import com.github.pagehelper.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * @author zhangweilin
 * @date 2018/6/9 19:04
 * @description: 响应实体
 */
@ApiModel("返回的统一结果")
@Data
public class Result<T> implements Serializable {
    /**
     *
     */
    private static final long serialVersionUID = 8006210338194670547L;

    /**
     * 错误码
     */
    @ApiModelProperty(value = "错误码,几个固定值为:  " +
            "200:成功, " +
            "301:客户端重定向，结果result字段中，会带一个重定向的url，它会是一个绝对地址，以http(s)开头,如http://xxx.xx.com/get/233, " +

            "400:参数不合法, " +
            "401:未认证，未登录，一般需要跳转到登录界面要求登录,  " +
            "403:已登录，但是无权限，拒绝访问, " +
            "404:资源找不到,  " +
            "460:登录的用户未绑定，一般为第三方账户未与本地账号有绑定关系, " +
            "500:错误提示。 " +
            "600:接口请求正常，但是有来自接口的业务提示 ")
    private String code;

    /**
     * 对应错误消息描述，适合单个错误消息
     */
    @ApiModelProperty(value = "对应错误消息描述，适合单个错误消息")
    private Object message;

    /**
     * 对应错误消息描述，适合多个错误消息
     */
    @ApiModelProperty(value = "对应错误消息描述，适合多个错误消息")
    private List<Object> messageList;

    /**
     * 结果
     */
    @ApiModelProperty(value = "返回的结果集")
    private T result;

    public Result() {
    }

//    public static Result<T> newInstance(){
//        return new Result<T>();
//    }

    public Result(String code) {
        this.code = code;
        this.message = ErrorCode.errorMap.get(code);
    }

    public Result(String code, String message) {
        this.code = code;
        this.message = message;
    }

    public Result(String code, List<Object> messageList) {
        this.code = code;
        this.messageList = messageList;
    }

    /**
     * 有错误信息，但是也有结果
     *
     * @param code
     * @param message
     * @param result
     */
    public Result(String code, String message, T result) {
        this.code = code;
        this.message = message;
        this.result = result;
    }

    /**
     * 有错误信息，但是也有结果
     *
     * @param code
     * @param messageList
     * @param result
     */
    public Result(String code, List<Object> messageList, T result) {
        this.code = code;
        this.messageList = messageList;
        this.result = result;
    }

    /**
     * 没有错误信息，但是也有结果
     *
     * @param code
     * @param result
     */
    public Result(String code, T result) {
        this.code = code;
        this.result = result;
    }

    public void setCode(String code) {
        this.code = code;
        this.message = ErrorCode.errorMap.get(code);
    }
//
//    public void setResult(T result) {
//        this.result =   result;
//    }

    /**
     * 分页专用，因为分页结果需要二次包装
     * @param result
     */
    public void setPageResult(Object result) {
        //如果是pageHelper或jpa的分页结果集
        if (result instanceof Page || result instanceof org.springframework.data.domain.Page) {
            PageInfo pageInfo = RequestContext.getPageInfo();
            pageInfo.setResultList(result);
            this.result = (T) pageInfo;
            return;
        }
        this.result = (T) result;
    }
}
